/*  Geometria  e  mappe (in casi meno semplificati conviene dividere
    geometria da mappe ed elaborate le mappe in mappe di influenza */

:- use_module('types/syntax').
check_me :- ensure_loaded('types/chk'),
	load([geometry]).
	
/******  GEOMETRIA  *******************/

%	spostamento dato dal vettore dir(DX,DY)
      
spostamento(p(X,Y),P,dir(DX,DY)):-
	var(P) ->
		  not(guarda(p(X,Y),dir(DX,DY),u)),
		  rosa_venti(dir(DX,DY)),
          X1 is X+DX,
	      Y1 is Y+DY,
	      P = p(X1,Y1)
	      ;
	     P=p(X1,Y1),
	     DX is X1-X,
	     DY is Y1-Y,
	     rosa_venti(dir(DX,DY)),
	     not(guarda(p(X,Y),dir(DX,DY),u)).
	    
% direzioni:  dir(0,-1) nord, dir(0,1) sud, dir(-1,0) ovest,
%             dir(1,0) est e le somme danno le direzioni miste
%             ad es: nord-est = dir(0,-1)+dir(1,0) = dir(1,-1)
rosa_venti(dir(DX,DY)) :-
	member(DY,[1,0,-1]),
	member(DX,[-1,0,1]),
	not((DX = 0, DY = 0)),
	abs(DX) =\= abs(DY).

%	distanza minima con il vincolo di movimento su
%   diagonali, orizzontale, verticale nella griglia (0.94~1)
distanza_griglia(p(X1,Y1), p(X2,Y2), D) :-
	abs(X1-X2) < abs(Y1-Y2) ->
	        D is abs(Y1-Y2) + 0.41*abs(X1-X2)
		;
		D is abs(X1-X2) + 0.41*abs(Y1-Y2).